package com.catazy.base.data.retrofit

import retrofit2.Call
import retrofit2.CallAdapter
import retrofit2.Retrofit
import java.lang.reflect.ParameterizedType
import java.lang.reflect.Type

/**
 * 作者: Tao
 * 日期: 2024/12/20
 * 时间: 14:40
 * 描述: 自定义的Call适配器工厂类，用于创建适应特定需求的Call适配器
 *  这个工厂类主要用于处理返回类型为ApiResult的API调用
 */
class ApiResultAdapterFactory : CallAdapter.Factory(){
    /**
     * 创建并返回一个CallAdapter实例
     *
     * @param returnType API调用的返回类型，用于确定是否适用此适配器
     * @param annotations 定义在返回类型上的注解，本方法中未使用
     * @param retrofit Retrofit实例，本方法中未使用
     * @return 如果适用此适配器，则返回一个CallAdapter实例，否则返回null
     */
    override fun get(
        returnType: Type,
        annotations: Array<out Annotation>,
        retrofit: Retrofit): CallAdapter<*, *>? {
        // 检查返回类型是否为Call，因为本适配器只适用于Call类型
        if (Call::class.java != getRawType(returnType)) return null
        // 确保返回类型是泛型类型，以便进行进一步的类型检查
        check(returnType is ParameterizedType)

        // 获取Call类型的泛型参数，即实际的响应类型
        val responseType = getParameterUpperBound(0, returnType)
        // 检查响应类型是否为ApiResult，因为本适配器专用于处理ApiResult类型
        if (getRawType(responseType) != ApiResult::class.java) return null
        // 确保ApiResult类型也是泛型类型，以便获取其内部的成功类型
        check(responseType is ParameterizedType)
        // 获取ApiResult类型的泛型参数，即成功时的数据类型
        val successType = getParameterUpperBound(0, responseType)

        // 返回自定义的ApiResultCallAdapter实例，处理成功类型为successType的API调用
        return ApiResultCallAdapter<Any>(successType)
    }

}
